package com.wyw.leetcode.learning.simple;

import java.util.ArrayList;
import java.util.List;

/**
 * leetcode topic 566
 *  重塑矩阵
 *      MATLAB 中，有一个非常有用的函数 reshape ，它可以将一个 m x n 矩阵重塑为另一个大小不同（r x c）的新矩阵，但保留其原始数据。
 *      给你一个由二维数组 mat 表示的 m x n 矩阵，以及两个正整数 r 和 c ，分别表示想要的重构的矩阵的行数和列数。
 *      重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
 *      如果具有给定参数的 reshape 操作是可行且合理的，则输出新的重塑矩阵；否则，输出原始矩阵。
 *
 * @Author Mr Wu    yewen.wu.china@gmail.com
 * Update History:
 * Author        Time            Content
 */
public class Topic566 {

    public static void main(String[] args) {

    }

    /**
     * 借助list
     * @param mat
     * @param r
     * @param c
     * @return
     */
    public static int[][] matrixReshape(int[][] mat, int r, int c) {
        int row = mat.length;
        int col = mat[0].length;
        if(row * col != r * c) {
            return mat;
        }

        List<Integer> list = new ArrayList<>(row * col);
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                list.add(mat[i][j]);
            }
        }

        int[][] result = new int[r][c];
        int index = 0;
        for(int i = 0; i < r; i++) {
            for(int j = 0; j < c; j++) {
                result[i][j] = list.get(index++);
            }
        }
        return result;

    }

    /**
     * 二维数组的一维表示
     * @param mat
     * @param r
     * @param c
     * @return
     */
    public static int[][] matrixReshapeq(int[][] mat, int r, int c) {
        int m = mat.length;
        int n = mat[0].length;
        if (m * n != r * c) {
            return mat;
        }

        int[][] ans = new int[r][c];
        for (int x = 0; x < m * n; ++x) {
            ans[x / c][x % c] = mat[x / n][x % n];
        }
        return ans;
    }

}
